home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 4: GNU Archives / Linux Cubed Series 4 - GNU Archives.iso / gnu / glibc-1.09 / glibc-1 / glibc-1.09.1 / sysdeps / i386 / lshift.S < prev    next >
Encoding:
Text File  |  1994-09-02  |  2.0 KB  |  84 lines

  1. # i80386 __mpn_lshift -- 
  2.  
  3. # Copyright (C) 1992, 1994 Free Software Foundation, Inc.
  4.  
  5. # This file is part of the GNU MP Library.
  6.  
  7. # The GNU MP Library is free software; you can redistribute it and/or modify
  8. # it under the terms of the GNU Library General Public License as published by
  9. # the Free Software Foundation; either version 2 of the License, or (at your
  10. # option) any later version.
  11.  
  12. # The GNU MP Library is distributed in the hope that it will be useful, but
  13. # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  14. # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
  15. # License for more details.
  16.  
  17. # You should have received a copy of the GNU Library General Public License
  18. # along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
  19. # the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.  
  22. # INPUT PARAMETERS
  23. # res_ptr    (sp + 4)
  24. # s_ptr        (sp + 8)
  25. # size        (sp + 12)
  26. # cnt        (sp + 16)
  27.  
  28. #include "sysdep.h"
  29. #include "asm-syntax.h"
  30.  
  31. .text
  32.     .align 2
  33.     .globl C_SYMBOL_NAME(__mpn_lshift)
  34. C_SYMBOL_NAME(__mpn_lshift):
  35.     pushl    %edi
  36.     pushl    %esi
  37.     pushl    %ebx
  38.  
  39.     movl    16(%esp),%edi    # res_ptr
  40.     movl    20(%esp),%esi    # s_ptr
  41.     movl    24(%esp),%edx    # size
  42.     movl    28(%esp),%ecx    # cnt
  43.  
  44.     subl    $4,%esi            # adjust s_ptr
  45.  
  46.     movl    (%esi,%edx,4),%ebx    # read most significant limb
  47.     xorl    %eax,%eax
  48.     shldl    %cl,%ebx,%eax        # compute carry limb
  49.     decl    %edx
  50.     jz    Lend
  51.     pushl    %eax            # push carry limb onto stack
  52.     testb    $1,%edx
  53.     jnz    L1            # enter loop in the middle
  54.     movl    %ebx,%eax
  55.  
  56.     .align    2,0x90
  57. Loop:    movl    (%esi,%edx,4),%ebx    # load next lower limb
  58.     shldl    %cl,%ebx,%eax        # compute result limb
  59.     movl    %eax,(%edi,%edx,4)    # store it
  60.     decl    %edx
  61. L1:    movl    (%esi,%edx,4),%eax
  62.     shldl    %cl,%eax,%ebx
  63.     movl    %ebx,(%edi,%edx,4)
  64.     decl    %edx
  65.     jnz    Loop
  66.  
  67.     shll    %cl,%eax        # compute least significant limb
  68.     movl    %eax,(%edi)        # store it
  69.  
  70.     popl    %eax            # pop carry limb
  71.  
  72.     popl    %ebx
  73.     popl    %esi
  74.     popl    %edi
  75.     ret
  76.  
  77. Lend:    shll    %cl,%ebx        # compute least significant limb
  78.     movl    %ebx,(%edi)        # store it
  79.  
  80.     popl    %ebx
  81.     popl    %esi
  82.     popl    %edi
  83.     ret
  84.